
22.04.2016, 17:58
|
Интересующийся
|
|
Регистрация: 08.04.2016
Сообщений: 10
|
|
Объединение разных объектов JSON
Всем привет! Сразу принесу извинения за "многобукаф".
Есть JSON, который выглядит следующим образом:
response: {
items: [
{from_id: 111111,
message: 'Hello world'},
{from_id: 111111,
message: 'Hello world'},
{from_id: 111112,
message: 'Lorem ipsum'},
],
profiles:[
{id: 111111,
first_name: 'Иван'},
{id: 111112,
first_name: 'Степан'}
]
}
Моя задача заключается в том, чтобы объединить данные из разных объектов, а именно:
first_name из profiles объединить с message из items. И объединить их таким образом, чтобы они действительно соответствовали друг другу.
Как я пробовал это сделать:
Не буду расписывать весь код, дабы не перегружать и без того объемный текст, перейду к сути:
var items_message = data.response.items.length;
var profiles_count = data.response.profiles.length;
for (var i=0; i<profiles_count; i++) {
for (var j=0; j<items_message; j++)
{
if(data.respone.profiles[i].id !== data.response.items[j].from_id)continue;
var profilesStr += data.response.profiles[i].first_name + ' ' + 'Написал:' + ' ' + data.response.items[j].text;
document.getElementById('example').innerHTML = profilesStr;
};
};
Такая конфигурация работает, но криво, т.е. и имена и посты вставляются в html, но не соответствуя друг другу. Плюс, если пользователь оставил несколько постов, то все они также вставляются в html.
Как решить данную задачу?
В итоге должно получаться, например:
'Иван написал: Hello world'
Последний раз редактировалось max_fruit, 23.04.2016 в 17:36.
|
|

23.04.2016, 13:29
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,989
|
|
Сообщение от max_fruit
|
Как решить данную задачу?
|
Сперва соответственно данные из базы получить, где они связаны, а не разбиты по частям.
|
|

23.04.2016, 14:48
|
Интересующийся
|
|
Регистрация: 08.04.2016
Сообщений: 10
|
|
А это возможно осуществить при работе с VK open API? Данный json я получаю в качестве ответа от VK (да, он выглядит несколько иначе, но суть та же), и, как я понял, это единственный способ взаимодействия с сервером (ну еще можно ту же информацию получить в формате xml).
|
|

23.04.2016, 16:50
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,989
|
|
Сообщение от max_fruit
|
А это возможно осуществить при работе с VK open API?
|
Нет конечно, это же не ваш сервер. Странная логика однако в такой структуре, хотя если предполагается работа только с какими либо из них, возможно и удобно такое.
Ну тогда обходить profiles и получать их сообщения. Но что есть from_id - это идентификатор сообщения? Если так, то где автор 111112?
|
|

23.04.2016, 17:44
|
Интересующийся
|
|
Регистрация: 08.04.2016
Сообщений: 10
|
|
Сообщение от laimas
|
Но что есть from_id - это идентификатор сообщения? Если так, то где автор 111112?
|
Да это идентификатор, указывающий на id пользователя, который оставил это сообщение. А на счет автора 111112 - пардон, это я опечатался.  111112 - это Степан (уже поправил).
Прошу прощения за глупый вопрос, но что значит "обходить"?  В объекте profiles указаны только данные пользователя (напр., имя, фамилия, id, город и т.д.), в объекте items - грубо говоря, информация о его постах, в том числе и текст этих постов. Причем даже если человек оставляет несколько одинаковых постов, то в items их будет столько, сколько он их оставил, хотя в profiles его данные будут указаны единожды. Обходить, т.е. делать что-то подобное, что я пытался делать до этого (именно пытался  )? Т.е. сравнивать from_id и id и на основании этого извлекать текст сообщений?
|
|

23.04.2016, 19:28
|
 |
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,149
|
|
max_fruit,
<!DOCTYPE html>
<html>
<head>
<title>Untitled</title>
<meta charset="utf-8">
</script>
</head>
<body>
<script>
var data = {
response: {
items: [{
from_id: 111111,
message: 'Hello world'
}, {
from_id: 111111,
message: 'Hello world'
}, {
from_id: 111112,
message: 'Lorem ipsum'
}, ],
profiles: [{
id: 111111,
first_name: 'Иван'
}, {
id: 111112,
first_name: 'Степан'
}]
}
}
var first_name = data.response.profiles.reduce(function(obj, el) {
obj[el.id] = el['first_name'];
return obj
}, {}),
mes = data.response.items.map(function(el) {
var id = el['from_id'];
return first_name[id] + ' написал: ' + el.message
})
document.write(mes.join('<br>'))
</script>
</body>
</html>
|
|

23.04.2016, 21:11
|
Интересующийся
|
|
Регистрация: 08.04.2016
Сообщений: 10
|
|
Огромное спасибо!
|
|

24.04.2016, 18:50
|
Интересующийся
|
|
Регистрация: 08.04.2016
Сообщений: 10
|
|
рони, ответьте, пожалуйста еще на два вопроса:
1) Если объект profiles имеет вид:
profiles: [{
first_name: {
eng:'Ivan',
rus:'Иван'
}
}]
, то почему не получается обратиться к нему вот таким способом: el['first_name']['rus'] (или el.first_name.rus) ?
2) Как при использовании метода reduce правильно использовать оператор if?
Попробовал следующим образом:
var first_name = data.response.profiles.reduce(function(obj, el) {
if(el['first_name'] !== 'Степан') {
obj[el.id] = el['first_name'];
return obj
} // так не работает
}, {}),
mes = data.response.items.map(function(el) {
var id = el['from_id'];
return first_name[id] + ' написал: ' + el.message
})
document.write(mes.join('<br>'))
Как, например, вывести сообщения только от Ивана, но не выводить сообщения от Степана?
Последний раз редактировалось max_fruit, 24.04.2016 в 18:53.
|
|

24.04.2016, 19:17
|
 |
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,149
|
|
max_fruit,
<!DOCTYPE html>
<html>
<head>
<title>Untitled</title>
<meta charset="utf-8">
</script>
</head>
<body>
<script>
var data = {
response: {
items: [{
from_id: 111111,
message: 'Hello world'
}, {
from_id: 111111,
message: 'Hello world'
}, {
from_id: 111112,
message: 'Lorem ipsum'
}, ],
profiles: [{
id: 111111,
first_name: {
eng: 'Ivan',
rus: 'Иван'
}
}, {
id: 111112,
first_name: {
eng: 'Stepan',
rus: 'Степан'
}
}]
}
}
var first_name = data.response.profiles.reduce(function(obj, el) {
obj[el.id] = el['first_name']['rus'];
return obj
}, {}),
mes = data.response.items.filter(function(el) {
var id = el['from_id'];
return first_name[id] != 'Степан'
}).map(function(el) {
var id = el['from_id'];
return first_name[id] + ' написал: ' + el.message
})
document.write(mes.join('<br>'))
</script>
</body>
</html>
|
|

24.04.2016, 19:29
|
 |
Профессор
|
|
Регистрация: 22.03.2012
Сообщений: 3,744
|
|
Сообщение от max_fruit
|
Всем привет! Сразу принесу извинения за "многобукаф".
Есть JSON, который выглядит следующим образом:
response: {
items: [
{from_id: 111111,
message: 'Hello world'},
{from_id: 111111,
message: 'Hello world'},
{from_id: 111112,
message: 'Lorem ipsum'},
],
profiles:[
{id: 111111,
first_name: 'Иван'},
{id: 111112,
first_name: 'Степан'}
]
}
|
из формальных соображений нужно сделать поправку, что это не json
|
|
|
|